<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 课前补充
        // 转义字符“\”
        // 多行字符串
        // 字符串换行\n
        // console.log('asdfg\nhjkl');

        //       RetExp
        // 正则表达式的作用：匹配特殊字符或有特殊搭配原则的字符的最佳选择。

        // 两种创建方式
        //     直接量
        // var reg = /abc/i;后面跟属性，i->忽视大小写  g->全局匹配  m->执行多行匹配
        // var reg = /^a/gm;
        // var str = 'asdf\nasdf\nasd';
        // console.log(str.match(reg));
        //     new RegExp
        // var reg = new RegExp('abc', 'i'); //第二个参数中写属性
        // var str = 'abcdE';
        // console.log(reg.test(str));
        // 推荐使用直接量
        // reg.test();//判断字符串上面有没有符合要求的片段
        // str.match();//把所有东西匹配出来返回

        //    表达式               描述
        //    [abc]               查找方括号之间的任何字符
        //    [^abc]              查找任何不在方括号之间的字符 
        //    [0-9]               查找任何从0至9的数字
        //    [a-z]               查找任何从小写a到小写z的字符
        //    [A-Z]               查找任何从大写A到大写Z的字符
        //    [A-z]               查找任何从大写A到小写z的字符
        //    [adgk]              查找给定集合内的任何字符
        //    [^adgk]             查找给定集合外的任何字符
        //    (red|blue|green)    查找任何指定的选项
        // var reg = /[1234567890][1234567890][1234567890]/g;
        // var str = '1213asfwd132a1f32w1da1fadw213213aswf2313';
        // console.log(str.match(reg));

        // 元字符
        // 元字符(Metacharacter)是拥有特殊含义的字符
        // 元字符                     描述
        // .===[^\r\n]            查找单个字符，除了换行和行结束符 
        // \w===[0-9A-z_]         查找单词字符
        // \W===[^\w]             查找非单词字符
        // \d                     查找数字
        // \D                     查找非数字字符
        // \s===[\t\n\r\v\f]      查找空白字符
        // \S                     查找非空白字符
        // \b===单词边界           匹配单词边界
        // \B===非单词边界         匹配非单词边界
        // \O                     查找NUL字符
        // \n                     查找换行符
        // \f                     查找换页符
        // \r                     查找回车符
        // \t                     查找制表符
        // \v                     查找垂直制表符
        // \xxx                   查找以八进制数xxx规定的字符
        // \xdd                   查找以十六进制数dd规定的字符
        // \uxxx                  查找以十六进制数xxx规定的Unicode
        // var reg = /\bcde\B/g;
        // var str = 'abc cdefgh';
        // console.log(str.match(reg));
        // var reg = /./g;
        // var str = '绝味鸭脖🃏 🃏';
        // console.log(str.match(reg));

        // 量词
        // 量词                       描述
        // n+  {1,正无穷}             匹配任何包含至少一个n的字符串
        // n*  {0,正无穷}             匹配任何包含零个或多个n的字符串
        // n?                         匹配任何包含零个或一个n的字符串
        // n{X}                       匹配包含X个n的序列的字符串
        // n{X,Y}                     匹配包含X至Y个n的序列的字符串
        // n{X,}                      匹配包含至少X个n的序列的字符串
        // n$                         匹配任何结尾为n的字符串
        // ^n                         匹配任何开头为n的字符串
        // ?=n                        匹配任何其后紧接指定字符串n的字符串
        // ?!n                        匹配任何其后没有紧接指定字符串n的字符串
        // var reg = /\w*/g;
        // var str = 'abc';
        // console.log(str.match(reg));

        // 写一个正则表达式，检验字符串首尾是否含有数字
        // var reg = /^\d|\d$/g;
        // var str = '1asfioheg1';
        // console.log(reg.test(str));
        // console.log(str.match(reg));

        // RegExp对象方法
        // 方法               描述
        // compile            编译正则表达式
        // exec               检索字符串中指定的值。返回找到的值，并确定其位置
        // test               检索字符串中指定的值。返回true或false
        // reg.exec(str);
        // var reg = /ab/g;
        // var str = 'abababab';
        // console.log(reg.lastIndex); //游标位置，可以修改
        // console.log(reg.exec(str));
        // console.log(reg.lastIndex);
        // console.log(reg.exec(str));
        // console.log(reg.lastIndex);
        // console.log(reg.exec(str));
        // console.log(reg.lastIndex);
        // console.log(reg.exec(str));
        // console.log(reg.lastIndex);
        // console.log(reg.exec(str));
        // console.log(reg.lastIndex);
        // console.log(reg.exec(str));
        // console.log(reg.lastIndex);
        // console.log(reg.exec(str));

        // var str = 'aaccccaa';
        // var reg = /(.)\1(.)\2/g; //括号（子表达式）会记录里面的内容(此示例为aabb式)，\1反向引用
        // console.log(str.match(reg));
        // console.log(reg.exec(str)); //'aacc','a','c'在数组索引位

        // 支持正则表达式的String对象的方法
        // 方法                         描述
        // search                    检索与正则表达式相匹配的值
        // match                     找到一个或多个正则表达式的匹配
        // replace                   替换与正则表达式匹配的子串
        // split                     把字符串分割为字符串数组

        // var str = 'aa';
        // // console.log(str.replace('a', 'b'));//非正则表达式的缺陷，看起来像是把所有的a替换成b，但是他没有访问全局的能力
        // var reg = /a/g;
        // console.log(str.replace(reg, 'b'));
        //
        // var reg = /(\w)\1(\w)\2/g;
        // var str = 'aabb';
        // console.log(str.replace(reg, '$2$2$1$1'));
        // 
        // var reg = /-(\w)/g;
        // var str = 'the-first-time';
        // console.log(str.replace(reg, function($, $1) {
        //     return $1.toUpperCase();
        // }));

        // 正向预查  正向断言
        // var str = 'abaaaaa';
        // var reg = /a(?=b)/g;
        // console.log(str.match(reg));

        // var str = 'aag aasab';
        // var reg = /a?/g; //?把正则表达式贪婪匹配变为非贪婪匹配
        // console.log(str.match(reg));

        // 字符串去重
        // var str = 'aaaaaaaaaaabbbbbbbccccccccccccccccdddeeeee';
        // var reg = /(\w)\1*/g;
        // console.log(str.replace(reg, '$1'));


        // 从后往前查，每个三位打个点
        // var str = '100000000000000';
        // var reg = /(?=(\B)(\d{3})+$)/g;
        // console.log(str.replace(reg, '.'));
    </script>
</body>

</html>